;(async function () {
  // 1. 引入mongoose
  const mongoose = require('mongoose')

  // 2. 使用mongoose连接mongodb数据库软件
  const promise = mongoose.connect('mongodb://127.0.0.1:27017/web0302')

  try {
    await promise
    console.log('数据库连接成功了')
  } catch (error) {
    console.log('数据库连接失败了')
    return
  }

  // 3. 创建约束对象
  // 原因: mongodb添加数据非常灵活,可以任意的添加各种属性. 创建约束对象是为了约束添加的数据的属性以及属性的数据类型
  const Schema = mongoose.Schema
  //比如: {name:'zs',age:18,info:'介绍',createTime:Date.now()}
  // 注意: 具体再插入数据的时候,mongoose会自动进行数据类型转换.所以可能规定了Number类型,但是插入数据时写的是String类型也可以
  // 注意: 如果后期要改Schema,可能修改的Schema不会生效.所以需要先删除已经生成的集合,然后再重新添加数据,则新的规则就会生效了
  const schema = new Schema({
    name: {
      type: String, // 约束了name属性的数据类型,
      required: true, // 约束了name属性是必填
      unique: true, // name属性的值在当前集合中不能重复
    },
    age: {
      type: Number, // 约束了age属性的数据类型是数字,
      required: true, // 约束了age属性是必填
    },
    info: {
      type: String,
    },
    createTime: {
      type: Date,
      default: Date.now(), //默认值
    },
  })

  // 4. 创建集合对象
  // 往mongodb中插入数据或其他操作,都是在操作集合.所以要先创建集合对象,才能进行增删改查的操作
  // 注意: 如果当前数据库中没有指定的集合,则mongoose会自动帮我们创建这个集合. 而且如果集合名没有s,则会自动在集合名后面加s
  const userModel = mongoose.model('user', schema)

  // 5. 查询数据
  // 其他增,删,改不关心返回值. 但是查询非常关心返回值

  // userModel.find() //返回符合条件的所有数据,一定是数组
  // userModel.findOne() //返回符合条件的第一条数据. 查到则返回数据对象,查不到则返回null
  // const value = await userModel.find()
  // const value = await userModel.findOne()
  // console.log(value)

  // 查询条件
  // 大于: $gt, 大于等于: $gte, 小于: $lt, 小于等于: $lte
  // 不等于 $ne
  // 或: $in, $or
  // 正则
  // 回调函数

  // const value = await userModel.find({ name: 'zzz', age: 16 }) //查找name是zzz,并且age是16的数据
  // const value = await userModel.find({ age: { $gt: 18 } }) //查找age大于18的数据
  // const value = await userModel.find({ age: { $ne: 44 } }) //查找age不等于44的数据

  // const value = await userModel.find({ age: { $in: [16, 44] } }) // 查找age为16或44的数据
  // const value = await userModel.find({ $or: [{ age: 16 }, { age: 44 }] }) // 查找age为16或44的数据
  // const value = await userModel.find({ $or: [{ age: 16 }, { name: 'zs' }] }) // 查找age为16或name为zs的数据

  // const value = await userModel.find({name: /^t/})  // 找到name以t开头的数据
  // const value = await userModel.find({
  //   $where: function () {
  //     return this.age === 16 || this.name === 'zs'
  //   },
  // }) // 查找age为16或name为zs的数据
  // console.log(value)

  // 集合对象.find / findOne(查询条件, 投影)
  // 查询条件: 决定了最终查找到了几条数据
  // 投影: 决定了查找到的数据展示哪些属性
  // const value = await userModel.find({ age: 16 }, { name: 1, age: 1, _id: 0 }) // 只看name和age
  // const value = await userModel.find({ age: 16 }, { __v: 0 }) // 不看__v
  // console.log(value)
})()
